import axios from "axios";
import router from "@/router"; // 创建 axios 实例
const base_url = import.meta.env.VITE_BASE_API
const service = axios.create({
    baseURL: base_url,
    timeout: 30000, // 请求超时时间
});

// 请求拦截器
service.interceptors.request.use(
    config => {
        // 在请求发送之前做一些处理，例如添加 token
        const token = localStorage.getItem('food:token');
        if (token) {
            config.headers['token'] = token;
        }
        return config;
    },
    error => {
        // 处理请求错误
        return Promise.reject(error);
    }
);

// 响应拦截器
service.interceptors.response.use(
    async response => {
        // 如果返回的状态码为200，说明接口请求成功，可以正常拿到数据
        const res = response.data
        // 否则的话抛出错误
        if (res.code === 200) {
            return Promise.resolve(res);
        } else if (res.code === 401) {
            // 未授权，清除token
            localStorage.removeItem('food:token');
            localStorage.removeItem('food:user');
            localStorage.setItem("isLogin", 'false')
            await router.push('/')
            return Promise.reject(res);
        } else if (response.status === 200) {
            return Promise.resolve(res);
        } else {
            return Promise.reject(response);
        }
    },
    async error => {
        // 处理响应错误
        if (error.response) {
            switch (error.response.status) {
                case 401:
                    localStorage.removeItem('food:token');
                    localStorage.removeItem('food:user');
                    localStorage.setItem("isLogin", 'false')
                    await router.push('/');
                    break;
                case 403:
                case 404:
                case 500:
                    // 这些错误可以在具体的业务组件中处理
                    break;
            }
            return Promise.reject(error.response);
        } else {
            // 处理断网的情况
            // eg: 请求超时或断网时，更新state的network状态
            // network状态在app.vue中控制着一个全局的断网提示组件的显示隐藏
            return Promise.reject(error);
        }
    }
);

// 封装请求方法
async function apiRequest(method: string, path: string, data = {}) {
    try {
        return await service.request({
            method,
            url: path,
            data: method === 'GET' ? undefined : data,
            params: method === 'GET' ? data : undefined,
        });
    } catch (error) {
        // 这里的错误已经被响应拦截器处理过了
        throw error;
    }
}

export default apiRequest;
